package com.fsm.common.sms4j.serviceImpl;

import com.fsm.common.sms4j.service.TextMessageService;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;

import java.util.LinkedHashMap;
import java.util.List;

public class TextMessageServiceImpl implements TextMessageService {

    /**
     * 发送固定消息模板短信
     * 此方法将使用配置文件中预设的短信模板进行短信发送
     * 该方法指定的模板变量只能存在一个（配置文件中）
     * 如使用的是腾讯的短信，参数字符串中可以同时存在多个参数，使用 & 分隔
     * 例如：您的验证码为{1}在{2}分钟内有效，可以传为 message="1234"+"&"+"5"
     *
     * @param configId 配置信息自定义的标识
     * @param phone 手机号
     * @param messages 发送内容，单个参数,没有则传null
     * @return
     */
    @Override
    public Boolean sendingTextMessageText(String configId, String phone, String messages) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend(configId);
        SmsResponse smsResponse = smsBlend.sendMessage(phone,messages);
        return smsResponse.isSuccess();
    }

    /**
     * 发送固定模板多模板参数短信
     * 在使用中有很多用户反馈，很多时候需要单个模板，但是模板中存在多个参数的短信，所以我们对此进行了适配
     * 同样，有时候模板中并没有存在变量，所以可以直接在 messages中填写null即可
     *
     * @param configId 配置信息自定义的标识
     * @param phone 手机号
     * @param messages 发送内容，多个参数,没有则传null
     * @return
     */
    @Override
    public Boolean sendingTextMessageJson(String configId, String phone, LinkedHashMap<String,String> messages) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend(configId);
        SmsResponse smsResponse = smsBlend.sendMessage(phone,messages);
        return smsResponse.isSuccess();
    }

    /**
     * 使用指定模板发送短信
     * 使用指定模板进行短信发送，templateId为模板ID，messages为短信内容，
     * 在messages中可以存在一个或多个变量，取决于模板
     * key为模板的变量名称，value为模板变量的值
     *
     * @param phone 手机号
     * @param messages 发送内容，多个参数,没有则传null
     * @param templateId 模板ID
     * @return
     */
    @Override
    public Boolean sendingTextMessageTemplateId(String templateId, String phone, LinkedHashMap<String, String> messages) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend();
        SmsResponse smsResponse = smsBlend.sendMessage(phone, templateId, messages);
        return smsResponse.isSuccess();
    }

    /**
     * 群发短信，固定模板短信
     * 此方法使用配置文件中预设的短信模板进行短信发送
     * 该方法指定的模板变量只能存在一个（配置文件中）
     * phones 为要群发的手机号
     * 考虑到性能和大部分的厂商支持，不建议一次性发送超过1000个手机号
     * 如果有大量短信需要进行群体发送，建议使用异步群发短信或分批次多次发送
     *
     * @param configId 配置信息自定义的标识
     * @param phones 群发的手机号
     * @param messages 发送内容，单个参数,没有则传null
     * @return
     */
    @Override
    public Boolean MassSendingTextMessageText(String configId, List<String> phones, String message) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend(configId);
        SmsResponse smsResponse = smsBlend.massTexting(phones,message);
        return smsResponse.isSuccess();
    }

    /**
     * 使用自定义模板群发短信
     * 与单体自定义模板短信类似，区别为此方法是群发短信，可以同时向多个手机号进行发送
     * 考虑到性能和大部分的厂商支持，不建议一次性发送超过1000个手机号
     * 如果有大量短信需要进行群体发送，建议使用异步群发短信或分批次多次发送
     *
     * @param phones 群发的手机号
     * @param templateId 模板ID
     * @param messages 发送内容，多个参数,没有则传null
     * @return
     */
    @Override
    public Boolean MassSendingTextMessageJson(List<String> phones, String templateId, LinkedHashMap<String, String> messages) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend();
        SmsResponse smsResponse = smsBlend.massTexting(phones,templateId,messages);
        return smsResponse.isSuccess();
    }

    /**
     * 使用固定模板发送延时短信
     * 使用配置文件中定义的模板和变量发送延时短信，delayedTime为延迟时间，单位为毫秒
     *
     * @param configId 配置信息自定义的标识
     * @param phone 手机号
     * @param messages 发送内容，单个参数,没有则传null
     * @param delayedTime 延时时间，单位为毫秒
     * @return
     */
    @Override
    public void delayedSendingTextMessageText(String configId, String phone, String messages, Long delayedTime) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend(configId);
        smsBlend.delayedMessage(phone,messages,delayedTime);
    }

    /**
     * 使用自定义模板发送延时短信
     * 该方法使用方式与标准方法中的自定义模板发送方式一致，末尾添加了一个delayedTime延迟时间参数，单位为毫秒
     *
     * @param phone 手机号
     * @param templateId 模板ID
     * @param messages 发送内容，多个参数,没有则传null
     * @param delayedTime 延时时间，单位为毫秒
     * @return
     */
    @Override
    public void delayedSendingTextMessageJson(String phone, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend();
        smsBlend.delayedMessage(phone,templateId,messages,delayedTime);
    }

    /**
     * 群发固定模板延迟短信
     *
     * @param configId 配置信息自定义的标识
     * @param phones 群发的手机号
     * @param messages 发送内容，单个参数,没有则传null
     * @param delayedTime 延时时间，单位为毫秒
     * @return
     */
    @Override
    public void delayedMassSendingTextMessageText(String configId, List<String> phones, String message, Long delayedTime) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend(configId);
        smsBlend.delayMassTexting(phones,message,delayedTime);
    }

    /**
     * 群发自定义模板延迟短信
     *
     * @param phones 群发的手机号
     * @param templateId 模板ID
     * @param messages 发送内容，多个参数,没有则传null
     * @param delayedTime 延时时间，单位为毫秒
     * @return
     */
    @Override
    public void delayedMassSendingTextMessageJson(List<String> phones, String templateId, LinkedHashMap<String, String> messages, Long delayedTime) throws Exception {
        SmsBlend smsBlend = SmsFactory.getSmsBlend();
        smsBlend.delayMassTexting(phones,templateId,messages,delayedTime);
    }

}
